package br.com.eventime.control;

import java.io.Serializable;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.submenu.Submenu;
import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.MenuModel;

import br.com.eventime.entity.GruposMenus;
import br.com.eventime.entity.Menus;
import br.com.eventime.entity.Usuario;
import br.com.eventime.service.SegurancaService;

@ManagedBean(name = "segurancaControl")
@SessionScoped
public class SegurancaControl implements Serializable {

	private static final long serialVersionUID = 1L;

	@EJB
	private SegurancaService segurancaService;
	private MenuModel menuModel;
	
	@Inject
	private Usuario usuario;

	private String login;
	private String senha;
	
	private void processaMenu(List<Menus> listSeguranca,List<GruposMenus> listPermissoes, Submenu subMenu, MenuModel model, Boolean superUsuario) throws Exception {
		if(listPermissoes == null || listSeguranca == null){
			throw new Exception("Permissões ou menus não cadastrados.");
		}
		
		boolean isAutorizado = false;
		
		for (Menus segurancaItem : listSeguranca) {

			if(!superUsuario){
				for (GruposMenus permissoes : listPermissoes) {

					if (permissoes.getMenus().getCodigo() == segurancaItem.getCodigo()) {
						isAutorizado = true;
						break;
					} else {
						isAutorizado = false;
					}

				}

				if (!isAutorizado) {
					isAutorizado = false;
					continue;
				}
			}

			if (segurancaItem.getMenusFilho() != null && segurancaItem.getMenusFilho().size() > 0) {

				Submenu subMenuItem = new Submenu();
				subMenuItem.setLabel(segurancaItem.getDescricao());

				if (subMenu != null) {
					subMenu.getChildren().add(subMenuItem);
				} else {
					model.addSubmenu(subMenuItem);
				}

				processaMenu(segurancaItem.getMenusFilho(), listPermissoes,subMenuItem, model,superUsuario);
			} else {
				MenuItem menuItem = new MenuItem();
				menuItem.setValue(segurancaItem.getDescricao());
				menuItem.setUrl(segurancaItem.getPagina());

				if (subMenu != null) {
					subMenu.getChildren().add(menuItem);
				} else {
					model.addMenuItem(menuItem);
				}

			}
		}
	}

	public String login() {
		try {
			usuario = segurancaService.login(login, senha);
			List<GruposMenus> listGruposMenus = segurancaService.getPermissoes(usuario.getUsuariosGrupos());
			List<Menus> listMenus = segurancaService.getListMenus();
			menuModel = new DefaultMenuModel();
			processaMenu(listMenus, listGruposMenus, null, menuModel,usuario.getSuperusuario());
			HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
			session.setAttribute("usuarioSessao", usuario);
		} catch (Exception e) {
	        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,"Aviso", e.getMessage()));
	        senha = null;
	        return null;
		}
		return "/index.xhtml";
	}

	public String sair(){
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().clear();
		return "/index.jsp";
	}
	
	public MenuModel getMenuModel() {
		return menuModel;
	}

	public void setMenuModel(MenuModel menuModel) {
		this.menuModel = menuModel;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public void setSegurancaService(SegurancaService segurancaService) {
		this.segurancaService = segurancaService;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	
}
